/******************************************************************************************
 *   Obsługa transmisji szeregowej (uart.c)
 *
 *   Utworzono: 29-01-2011
 *       Autor: Marcin
 *****************************************************************************************/

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "uart.h"

/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

/*
 * 	Funkcja inicjalizująca transmisję UART
 *  Argument: baud - stała wyliczana przez kompilator określająca prędkość transmisji
 */
void uart_init(uint16_t baud){
	/* Ustawienie prędkości transmisji */
	UBRR0H = (uint8_t)(baud>>8);
	UBRR0L = (uint8_t)baud;

	/* Załączenie nadajnika i odbiornika */
	UCSR0B = (1<<RXEN0) | (1<<TXEN0);

	/* Ustawienie formatu ramki [prędkość], 8 bitów danych, n - bez bitów parzystości, 1 - bit stopu */
	UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);

	uart_clear();
}/* uart_init */

#if USE_UART_ISR == 1

#else
	/*
	 * 	Funkcja wysyłająca znak przez UART
	 *  Argument: data - znak do wysłania
	 */
	void uart_write_char(unsigned char data){
		/* Czekaj aż bufor nadawczy będzie pusty */
		while(!(UCSR0A & (1<<UDRE0)));

		/* Wrzuć dane do bufora nadawczego, start transmisji */
		UDR0 = data;
	}/* uart_write_char */

	/*
	 * 	Funkcja odbierająca znak z UART
	 *  Wynik: znak odebrany z UART
	 */
	unsigned char uart_read_char(void){
		/* Czekaj aż dane zostaną odebrane do bufora */
		while(!(UCSR0A & (1<<RXC0)));

		/* Zwróć zawartość bufora */
		return UDR0;
	}/* uart_read_char */
#endif

/*
 * 	Funkcja wysyłająca string przez UART
 *  Argument: *str - wskaźnik do stringa w pamięci RAM
 */
void uart_write_text(char *str)
{
	register char c;
	while ((c = *str++))
		uart_write_char(c);
}/* uart_write_text */

/*
 * 	Funkcja wysyłająca string z pamięci FLASH przez UART
 *  Argument: *str - wskaźnik do stringa w pamięci FLASH
 */
#if USE_UART_STR_P == 1
	void uart_write_text_P(const char *str){
		register char znak;
		while ((znak=pgm_read_byte(str++)))
			uart_write_char(znak);
	}/* uart_write_text_P */
#endif

/*
 * 	Funkcja wysyłająca tekst z pamięci EEPROM przez UART
 *  Argument: *str - wskaźnik do stringa
 */
#if USE_UART_STR_E == 1
void uart_write_text_E(char *str){
	register char znak;
	while(1)
	{
		znak=eeprom_read_byte( (uint8_t *)(str++) );
		if(!znak || znak==0xFF)
			break;
		else
			uart_write_char(znak);
	}
}/* uart_write_text_E */
#endif

/*
 * 	Funkcja wysyłająca liczbę dziesiętną przez UART
 *  Argument: val - liczba do wysłania przez UART
 */
#if USE_UART_INT == 1
	void uart_write_int(int val, uint8_t zero){
		char string[17];
		if((val < 10)){
			switch (zero){
				case 0x01:		uart_write_text_P(PSTR("0"));
								break;
				case 0x02:		uart_write_text_P(PSTR(" "));
								break;
				default:	break;
			}
		}
		uart_write_text(itoa(val, string, 10));
	}/* uart_write_int */
#endif

/*
 * 	Funkcja wysyłająca liczbę szesnastkową przez UART
 *  Argument: val - liczba do wyświetlenia
 */
#if USE_LCD_HEX == 1
	void uart_write_hex(int val){
		char bufor[17];
		//uart_write_text_P(PSTR("0x"));
		if(val <= 0x0F)
			uart_write_text_P(PSTR("0"));
		uart_write_text(itoa(val, bufor, 16));
	}/* uart_write_hex */
#endif

/*
 * 	Funkcja czyszcząca okno terminala
 */
void uart_clear(void){
    uart_write_char(27);
    uart_write_char('[');
    uart_write_char('H');
    uart_write_char(27);
    uart_write_char('[');
    uart_write_char('2');
    uart_write_char('J');
    uart_write_char(0);
}/* uart_clear */

/*
 * 	Funkcja przesuwająca kursor na początek okna terminala
 */
void uart_home(void){
	uart_write_char(27);
	uart_write_char('[');
	uart_write_char('H');
	uart_write_char(0);
}/* uart_home */

/*
 * 	Funkcja wysyłająca liczbę znak nowej linii przez UART
 */
void uart_new_line(void){
	uart_write_text_P(PSTR("\r\n"));
}/* uart_new_line */

/******************************************************************************************
 *	Koniec pliku uart.c
 *****************************************************************************************/
